package cn.edu.hstc.wm.ui;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ViewSwitcher;

import cn.edu.hstc.wm.AccessTokenKeeper;
import cn.edu.hstc.wm.AppApplication;
import cn.edu.hstc.wm.AppConfigs;
import cn.edu.hstc.wm.Constants;
import cn.edu.hstc.wm.R;
import cn.edu.hstc.wm.bean.User;
import cn.edu.hstc.wm.exception.AppException;
import cn.edu.hstc.wm.service.AppConfigService;
import cn.edu.hstc.wm.service.UserService;
import cn.edu.hstc.wm.ui.base.BaseActivity;
import cn.edu.hstc.wm.utils.IntentUtil;
import cn.edu.hstc.wm.utils.LogUtil;
import cn.edu.hstc.wm.utils.StringUtils;
import cn.edu.hstc.wm.widget.CustomToast;

import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth.AuthInfo;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.widget.LoginButton;

/**
 * 用户登录窗口
 * 
 */
public class UserLoginDialog extends BaseActivity {

	private static final String TAG = UserLoginDialog.class.getName();

	/** 登录状态结果 */
	private final int LOGIN_STATUS_ERROR = -1;
	private final int LOGIN_STATUS_FALIED = 0x00;
	private final int LOGIN_STATUS_SUCCESS = 0x01;

	
	
	/** 进入登录界面的来源 */
	private int mCurLoginType;

	/** 新浪登录按钮 */
	private LoginButton mSinaLoginButton;
	/** 封装了 "access_token"，"expires_in"，"refresh_token"，并提供了他们的管理功能 */
	private Oauth2AccessToken mAccessToken;

	/** 账号输入框 */
	private AutoCompleteTextView mAccount;
	/** 密码输入框 */
	private EditText mPassword;
	/** 记住用户 */
	private CheckBox mRememberMe;
	/** 登录 */
	private Button mLogin;
	/** 正在登录效果 */
	private View mLoadingView;
	private AnimationDrawable mAnimationDrawable;
	private ViewSwitcher mSwitcher;

	/** 用来包装登录用户信息 */
	private User mUser;
	/** 登录处理相應結果 */
	private LoginHandler mHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.user_login_layout);
		mCurLoginType = getIntent().getIntExtra(Constants.LOGIN_TYPE, 0);
		Log.d(TAG, "login type is " + mCurLoginType + "   " + getIntent().toString() + "  action " + getIntent().getAction());

		initView();
		initLoginInfo();
		mHandler = new LoginHandler();
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (mSinaLoginButton != null) {
			// 如果设备安装了新浪客户端则使用SSO登录, 使用该方法回调SsoHandler
			// mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
			mSinaLoginButton.onActivityResult(requestCode, resultCode, data);
		}
	}

	/** 初始化View */
	private void initView() {
		mAccount = (AutoCompleteTextView) findViewById(R.id.actv_user_login_account);
		mPassword = (EditText) findViewById(R.id.et_user_login_password);
		mRememberMe = (CheckBox) findViewById(R.id.cb_user_login_rememberMe);
		mRememberMe.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				mUser.setRememberMe(isChecked);
				AppConfigService.putBoolVal2Conf(UserLoginDialog.this, Constants.USER_IS_REMENBER_ME, isChecked);
			}
		});
		mLogin = (Button) findViewById(R.id.bt_user_login_login);

		((ImageView) findViewById(R.id.iv_user_longin_show_password)).setOnClickListener(new OnClickListener() {
			boolean flag = true;

			public void onClick(View v) {
				if (flag) {
					// 显示密码
					CustomToast.make(UserLoginDialog.this).setText("显示密码").show();
					mPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
					flag = false;
				} else {
					// 不显示密码
					CustomToast.make(UserLoginDialog.this).setText("不显示密码").show();
					mPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
					flag = true;
				}
			}
		});
		mLogin.setOnClickListener(new OnLoginButtonListener());
		mLoadingView = findViewById(R.id.user_login_loading);
		mSwitcher = (ViewSwitcher) findViewById(R.id.viewswitcher_user_login);
		// mSwitcher.setAnimation(animation);

		// 初始化第三方账号登录
		mSinaLoginButton = (LoginButton) findViewById(R.id.btn_sina_login);
		setSinaButton();
	}

	/** 设置新浪微博登录信息 */
	private void setSinaButton() {
		// 创建微博实例
		AuthInfo authInfo = new AuthInfo(this, AppConfigs.APP_KEY, AppConfigs.REDIRECT_URL, AppConfigs.SCOPE);
		// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息， 第一次启动本应用，AccessToken
		// 不可用
		mAccessToken = AccessTokenKeeper.readAccessToken(this);
		if (mAccessToken.isSessionValid()) {
			// 直接登录
			
		}
		mSinaLoginButton.setWeiboAuthInfo(authInfo, new SinaAuthListener());

	}

	/** 初始化用户信息 */
	private void initLoginInfo() {
		AppApplication app = (AppApplication) getApplication();
		mUser = app.getLoginUser();
		if (mUser == null || !mUser.isRememberMe()) {
			// 没有保存用户信息
			mUser = new User();
			return;
		}
		if (!TextUtils.isEmpty(mUser.getName())) {
			mAccount.setText(mUser.getName());
			mAccount.selectAll(); // 选中全部
			mRememberMe.setChecked(mUser.isRememberMe()); // 记住用户
		}
		if (!TextUtils.isEmpty(mUser.getPassword())) {
			mPassword.setText(mUser.getPassword());
			mPassword.selectAll();
		}
	}

	/** 关闭登录窗口 */
	public void goBack(View view) {
		finish();
	}

	/** 用户注册 */
	public void goRegister(View view) {
		IntentUtil.startActivity(this, UserRegistDialog.class);
	}

	public void otherTypeLogin(View view){
		CustomToast.make(this).setText("其他第三方登录正在陆续加入中。。。").show();
	}
	
	/** 忘记密码 */
	public void forgetPasswd(View view) {
		CustomToast.make(this).setText("系統升級中。。。。\n請找管理員修改密碼").show();
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			// this.onDestroy();
			finish();
		}
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * 使用该用户去登录
	 * 
	 * @param user
	 */
	private void login(User user) {
		// 登录成功后根据不同的来源跳转到不同的界面
		// CustomToast.make(this).setText("正在登录,请稍后...").show();

		// 开启登录线程
		new LoginThread(user).start();
	}

	@SuppressLint("HandlerLeak")
	class LoginHandler extends Handler {
		public void handleMessage(Message msg) {

			LogUtil.d(TAG, "进入login 来源   : " + mCurLoginType);
			// 登录成功
			if (msg.what == LOGIN_STATUS_SUCCESS) {
				// User user = (User) msg.obj;
				switch (mCurLoginType) {

				case Constants.LOGIN_TYPE_UCENTER:
					// 跳转--用户中心
					goUCenter();
					break;

				case Constants.LOGIN_TYPE_SETTING_LOGIN:
					// 跳转--用户设置页面
					goSetting();
					break;

				case Constants.LOGIN_TYPE_SETTING_INFO:
					// 跳转--用户信息页面
					goSettingInfo();
					break;

				case Constants.LOGIN_TYPE_MY_ORDER:
					// 跳转--我的订单页面
					goMyOrder();
					break;

				case Constants.LOGIN_TYPE_MY_COMMENT:
					// 跳转--我的评价页面
					goMyComment();
					break;

				case Constants.LOGIN_TYPE_GO_ORDER:
					// 下订单
					goOrder();
					break;

				default:
					break;
				}

				finish();

			} else if (msg.what == LOGIN_STATUS_FALIED || msg.what == LOGIN_STATUS_ERROR) {
				// 返回登陆界面
				mSwitcher.showPrevious();
				CustomToast.make(UserLoginDialog.this).setText("登录失败").show();
			}
		}

		/** 从主界面进入用户中心 */
		private void goUCenter() {
			Intent intent = new Intent(UserLoginDialog.this, UCenter.class);
			intent.putExtra(Constants.LOGIN_RESULT, true);
			startActivity(intent);
		}

		/** 在设置页面上登录后返回设置页面 */
		private void goSetting() {
			// Intent intent = new Intent(UserLoginDialog.this,
			// SettingActivity.class);
			// intent.putExtra(Constants.LOGIN_RESULT, true);
			// startActivity(intent);
			setResult(Activity.RESULT_OK); // 登录成功
		}

		/** 跳转到用户中心，总设置界面进入的，关闭设置页面 */
		private void goSettingInfo() {
			Intent userInfoIntent = new Intent(UserLoginDialog.this, UCenter.class);
			userInfoIntent.putExtra(Constants.LOGIN_RESULT, true);
			setResult(Activity.RESULT_OK); // 关闭Setting页面
			startActivity(userInfoIntent);
		}

		/** 跳转到我的订单页面 */
		private void goMyOrder() {
			Intent intent = new Intent(UserLoginDialog.this, MyOrder.class);
			intent.putExtra(Constants.LOGIN_RESULT, true);
			startActivity(intent);
		}

		/** 跳转到我的评论页面 */
		private void goMyComment() {
			Intent intent = new Intent(UserLoginDialog.this, MyComment.class);
			intent.putExtra(Constants.LOGIN_RESULT, true);
			startActivity(intent);
		}

		/** 从下订单界面进入 */
		private void goOrder() {
			Intent intent = new Intent(UserLoginDialog.this, GoOrder.class);
			intent.putExtras(getIntent().getExtras());
			intent.putExtra(Constants.LOGIN_RESULT, true);
			setResult(Constants.LOGIN_TYPE_GO_ORDER);
			startActivityForResult(intent, 0);
		}
	}

	/** 登录线程 */
	class LoginThread extends Thread {
		User user;

		public LoginThread(User user) {
			this.user = user;
		}

		public void run() {

			Message msg = new Message();
			try {

				// 是否記住用戶信息
				AppConfigService.putBoolVal2Conf(UserLoginDialog.this, Constants.USER_IS_REMENBER_ME, mRememberMe.isChecked());
				AppApplication app = (AppApplication) getApplication();
				
				User verifyUser = app.loginVerify(user);

				if (null != verifyUser) {
					// 保存登录信息
					app.saveLoginInfo(verifyUser);
					AppConfigService.putStrVal2Conf(UserLoginDialog.this, Constants.USER_PASSWD, user.getPassword());
					msg.what = LOGIN_STATUS_SUCCESS;
					msg.obj = verifyUser;
				} else {
					// 清除登录信息
					// app.clearLoginInfo(verifyUser);
					msg.what = LOGIN_STATUS_FALIED;
					msg.obj = verifyUser;
				}

			} catch (AppException e) {
				e.printStackTrace();
				msg.what = LOGIN_STATUS_ERROR;
				msg.obj = e;
			} catch (Exception e) {
				e.printStackTrace();
				msg.what = LOGIN_STATUS_ERROR;
				msg.obj = e;
			}
			mHandler.sendMessage(msg);
		}
	}

	/**
	 * @ClassName: OnLoginButtonListener
	 * @Description:登录按钮监听器
	 * 
	 * @ModificationHistory
	 */
	private final class OnLoginButtonListener implements OnClickListener {

		public void onClick(View v) {

			// 隐藏键盘
			InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

			String userName = mAccount.getText().toString().trim();
			String password = mPassword.getText().toString().trim();
			boolean isRememberMe = mRememberMe.isChecked();

			if (!varifyInput(userName, password)) {
				return;
			}

			mAnimationDrawable = (AnimationDrawable) mLoadingView.getBackground();
			mAnimationDrawable.start();
			mSwitcher.showNext();

			// 简单的包装User 的账号密码用来验证的
			mUser.setName(userName);
			mUser.setPassword(password);
			mUser.setRememberMe(isRememberMe);

			login(mUser);
		}

	}

	/**
	 * 校验输入合法性
	 * 
	 * @param userName
	 * @param password
	 */
	private boolean varifyInput(String userName, String password) {
		if (StringUtils.isEmpty(userName)) {
			CustomToast.show(UserLoginDialog.this, "用户名不能为空", 0);
			return false;
		}
		if (StringUtils.isEmpty(password)) {
			CustomToast.show(UserLoginDialog.this, "密码不能为空", 0);
			return false;
		}
		return true;

	}

	private/**
			 * 微博认证授权回调类。 1. SSO 授权时，需要在 {@link #onActivityResult} 中调用
			 * {@link SsoHandler#authorizeCallBack} 后， 该回调才会被执行。 2. 非 SSO
			 * 授权时，当授权结束后，该回调就会被执行。 当授权成功后，请保存该 access_token、expires_in、uid 等信息到
			 * SharedPreferences 中。
			 */
	class SinaAuthListener implements WeiboAuthListener {

		@Override
		public void onComplete(Bundle values) {
			// 从 Bundle 中解析 Token
			mAccessToken = Oauth2AccessToken.parseAccessToken(values);
			if (mAccessToken.isSessionValid()) {
				// 保存 Token 到 SharedPreferences
				AccessTokenKeeper.writeAccessToken(UserLoginDialog.this, mAccessToken);
				Toast.makeText(UserLoginDialog.this, R.string.user_login_auth_success, Toast.LENGTH_SHORT).show();

				//new SinaLoginThread().start();

			} else {
				// 以下几种情况，您会收到 Code：
				// 1. 当您未在平台上注册的应用程序的包名与签名时；
				// 2. 当您注册的应用程序包名与签名不正确时；
				// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
				String code = values.getString("code");
				String message = getString(R.string.user_login_auth_fail);
				if (!TextUtils.isEmpty(code)) {
					message = message + "\nObtained the code: " + code;
				}
				Toast.makeText(UserLoginDialog.this, message, Toast.LENGTH_LONG).show();
			}
		}
		
		private class SinaLoginThread extends Thread{
			public void run(){
				Message msg = new Message();
				// 进入登录状态?
				if (!UserService.loginAuth(mAccessToken.getUid(), mAccessToken.getToken())) {
					//還沒註冊，
					UserService.authorize(mAccessToken.getUid(), mAccessToken.getToken());
				}
				
				if ((mUser =UserService.getUserByUid_Token(mAccessToken.getUid(), mAccessToken.getToken()))!=null) {
					//app.saveLoginInfo(mUser);
					//AppConfigService.putStrVal2Conf(UserLoginDialog.this, Constants.USER_PASSWD, mUser.getPassword());
					msg.what = LOGIN_STATUS_SUCCESS;
					msg.obj = mUser;
				}else {
					msg.what = LOGIN_STATUS_FALIED;
				}
				//mHandler.sendMessage(msg);
			}
		}
		@Override
		public void onCancel() {
			Toast.makeText(UserLoginDialog.this, R.string.user_login_auth_canceled, Toast.LENGTH_LONG).show();
		}

		@Override
		public void onWeiboException(WeiboException e) {
			Toast.makeText(UserLoginDialog.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
		}
	}

}
